Computer systems have continuously evolved over the past 60 years. Initial computer systems were room-sized, vacuum-tube-based behemoths with far less computational bandwidth and smaller data-storage capacities than a modern smart phone or even a microprocessor controller embedded in any of various consumer appliances and devices. Initial computer systems ran primitive programs one at a time, without the benefit of operating systems, high-level languages, and networking. Over time, parallel development of hardware, compilers, operating systems, virtualization technologies, and distributed-computing technologies has led to modern distributed computing systems, including cloud-computing facilities, that feature hundreds, thousands, tens of thousands, or more high-end servers, each including multiple multi-core processors, that can access remote computer systems and that can be accessed by remote client computers throughout the world through sophisticated electronic communications. Due to the complexity of modern distributed computing systems, it has become an exceedingly time-consuming and difficult task for system administrators and others who maintain distributed computer systems to upgrade distributed applications periodically, when new versions of the distributed applications become available. In a distributed computer system comprising thousands of physical servers, for example, a system administrator may have to carry out an essentially manual upgrade for each individual physical server. In the case that one of the upgrades fails, the system administrator is often left with an incompletely upgraded distributed application. In such cases, the system administrator may need to back out upgrades on already-upgraded servers or to suspend execution of many instances of the distributed application until upgrade problems can be addressed. Even the bookkeeping requirements for maintaining upgrade and version status for the many physical servers within a large distributed computing system may be at least onerous and often extremely error prone and complex. For all these reasons, designers and developers of distributed applications and distributed computer systems, system administrators, owners, and ultimately users of such systems continue to seek better methods and subsystems for addressing distributed-application upgrade.